From adf9605d5e69fb689eb8505205359c4f805b4e18 Mon Sep 17 00:00:00 2001 From: "cl349@firebug.cl.cam.ac.uk" Date: Fri, 13 May 2005 21:21:38 +0000 Subject: [PATCH] bitkeeper revision 1.1407 (42851a62m3iGb_ScYjvXzomQNk1N4Q) desc.h, process.c: [PATCH] Fixing TLS handling in x86-64 xenlinux Some LTP testcases (pthreads) have exposed this bug (kill the kernel), and the attached fixes the problem. With this, pth_str0? run fine, for example. We'll continue to run LTP on x86-64 xenlinux to get all of them pass. Signed-off-by: Jun Nakajima Signed-off-by: Christian Limpach --- linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/process.c | 4 ++-- linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/desc.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/process.c b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/process.c index a2e3c1f54e..263176f6b5 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/process.c +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/process.c @@ -247,6 +247,7 @@ static inline void set_32bit_tls(struct task_struct *t, int tls, u32 addr) struct user_desc ud = { .base_addr = addr, .limit = 0xfffff, + .contents = (3 << 3), /* user */ .seg_32bit = 1, .limit_in_pages = 1, .useable = 1, @@ -401,8 +402,7 @@ struct task_struct *__switch_to(struct task_struct *prev_p, struct task_struct * mcl->op = __HYPERVISOR_update_descriptor; \ mcl->args[0] = virt_to_machine(&get_cpu_gdt_table(cpu) \ [GDT_ENTRY_TLS_MIN + i]); \ - mcl->args[1] = (unsigned long) ((u64 *) &next->tls_array[i]); \ - mcl->args[2] = (unsigned long) ((u64 *) &next->tls_array[i]); \ + mcl->args[1] = next->tls_array[i]; \ mcl++; \ } \ } while (0) diff --git a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/desc.h b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/desc.h index dcc51d667d..15a10a135d 100644 --- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/desc.h +++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/desc.h @@ -65,9 +65,9 @@ struct desc_ptr { extern struct desc_ptr idt_descr, cpu_gdt_descr[NR_CPUS]; -extern struct desc_ptr cpu_gdt_table[NR_CPUS][GDT_ENTRIES]; +extern struct desc_struct cpu_gdt_table[NR_CPUS][GDT_ENTRIES]; -#define get_cpu_gdt_table(_cpu) ((struct desc_ptr *)(cpu_gdt_descr[(_cpu)].address)) +#define get_cpu_gdt_table(_cpu) ((struct desc_struct *)(cpu_gdt_descr[(_cpu)].address)) #define load_TR_desc() asm volatile("ltr %w0"::"r" (GDT_ENTRY_TSS*8)) #define load_LDT_desc() asm volatile("lldt %w0"::"r" (GDT_ENTRY_LDT*8)) -- 2.30.2